Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-0 vector-toc-not-available vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-0 skin-theme-clientpref-day vector-sticky-header-enabled" lang="de" dir="ltr"><head>
<meta charset="UTF-8">
<title>SQLJ</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="icon" type="image/png" href="./_res_/favicon.png">
<link rel="canonical" href="https://de.wikipedia.org/wiki/SQLJ"> <link href="./_mw_/ext.wikimediamessages.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./_mw_/skins.vector.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link href="./_mw_/ext.gadget.citeRef.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.defaultPlainlinks.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonHide.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonLayout.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiCommonStyle.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiDarkmode.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.dewikiResponsive.css" rel="stylesheet" type="text/css">
<link href="./_mw_/ext.gadget.specialSearch.css" rel="stylesheet" type="text/css">
<link rel="stylesheet" type="text/css" href="./_mw_/site.styles.css">
<link rel="stylesheet" type="text/css" href="./_mw_/noscript.css">
<link rel="stylesheet" type="text/css" href="./_res_/footer.css">
<link rel="stylesheet" type="text/css" href="./_res_/vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-SQLJ rootpage-SQLJ skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading"><span class="mw-page-title-main">SQLJ</span></h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="contentSub">
<div id="mw-content-subtitle"></div>
</div>
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="de" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="de" dir="ltr"><p><b>SQLJ</b> ist ein mittlerweile veralteter Arbeitstitel für Bestrebungen, Java und SQL zusammenzuführen. SQLJ Teil 0 definiert die Möglichkeit, SQL Statements in Java-Programme einzubinden. Teil 0 wurde mittlerweile als Teil 10 <i><a href="SQL#Sprachstandard" title="SQL">Object Language Bindings (SQL/OLB)</a></i> des Standards ISO/IEC 9075 der Datenbanksprache <a href="SQL" title="SQL">SQL</a> übernommen. Die Teile 1 und 2 beschreiben den umgekehrten Weg, nämlich Java Klassen (Routines and Types) in SQL Statements anzusprechen. Teil 1 und 2 wurden als <i>SQL Teil 13 SQL Routines and Types Using the Java Programming Language</i> in SQL standardisiert.
</p><p>Im Folgenden steht der Begriff SQLJ als Synonym für SQLJ Part 0.
</p><p>Mit SQLJ ist <a href="Embedded_SQL" title="Embedded SQL">Embedded SQL</a> für Java definiert. Im Gegensatz dazu stellt <a href="Java_Database_Connectivity" title="Java Database Connectivity">JDBC</a> eine <a href="Programmierschnittstelle" title="Programmierschnittstelle">API</a> bereit.
</p>

<div class="mw-heading mw-heading2"><h2 id="Format">Format</h2></div>
<p>Die eingebettete SQL-Anweisungen haben das folgende Format:
</p>
<pre> <b>#sql [[&lt;context&gt;]] { &lt;SQL-Anweisung&gt; }</b>;
</pre>
<p>Sie beginnen mit der Zeichenfolge #sql, können mehrere Zeilen umfassen und enden mit einem Semikolon. Sie können Java-Variablen (:x) und Ausdrücke&nbsp;:(y + z) enthalten.
</p>
<div class="mw-heading mw-heading2"><h2 id="Vor-_und_Nachteile">Vor- und Nachteile</h2></div>
<p>SQLJ bietet mehrere Vorteile:
</p>
<ul><li>die Programmierung ist im Vergleich zu <a href="Java_Database_Connectivity" title="Java Database Connectivity">JDBC</a> wesentlich einfacher, da SQLJ direkt auf Variablen des umgebenden Java-Codes zugreifen kann.</li>
<li>im Falle von SQLJ für IBMs <a href="Db2" title="Db2">DB2</a> besteht eine bessere Authentifizierungskontrolle, da Benutzerrechte nicht auf Basis von Tabellen, sondern auf Basis von gebundenen SQLJ Profilen (Packages) geprüft werden, damit ist eine programmorientierte Berechtigung möglich.</li>
<li>Der SQLJ Translator überprüft die Syntax und Semantik von SQL-Anweisungen. Es besteht so die Möglichkeit, die Anweisungen gegen das Datenbankschema zu prüfen, wobei SQL-Fehler frühzeitig entdeckt und behoben werden können. Im Gegensatz hierzu werden bei Verwendung von JDBC Fehler erst zur Laufzeit erkannt.</li></ul>
<p>Nachteile sind:
</p>
<ul><li>SQLJ-Programme müssen mittels eines <a href="Pr%C3%A4prozessor" title="Präprozessor">Präprozessors</a> in Java-Quelltext transformiert werden</li>
<li>die SQLJ Syntax wird von vielen <a href="Integrierte_Entwicklungsumgebung" title="Integrierte Entwicklungsumgebung">Entwicklungsumgebungen</a> nicht erkannt</li>
<li>SQLJ wird durch gängige Persistenz-Frameworks wie <a href="Hibernate_(Framework)" title="Hibernate (Framework)">Hibernate</a> nicht unterstützt</li>
<li>Der Präprozessor versteht, Stand Anfang 2006, noch keine Elemente der <a href="Java-Syntax" title="Java-Syntax">Java-Syntax</a>, die mit den Versionen 1.4 (<a href="Assert" class="mw-redirect" title="Assert">assert</a>) und 5.0 (<a href="Generische_Programmierung_in_Java_5.0" class="mw-redirect" title="Generische Programmierung in Java 5.0">Generische Typen</a>, <i>Extended For Loop</i> u.&nbsp;a.) eingeführt wurden.</li>
<li>Der Präprozessor lädt unter Umständen Klassen, von denen die zu übersetzende Klasse abhängt. Dadurch werden ggf. Klasseninitialisierer ausgeführt, was u.&nbsp;U. Nebenwirkungen auslöst oder die <a href="%C3%9Cbersetzungszeit" title="Übersetzungszeit">Übersetzungszeit</a> verlängert.</li></ul>
<div class="mw-heading mw-heading2"><h2 id="Beispiele_und_Vergleich_mit_JDBC">Beispiele und Vergleich mit JDBC</h2></div>
<p>Die folgenden Beispiele vergleichen SQLJ-Syntax mit <a href="Java_Database_Connectivity" title="Java Database Connectivity">JDBC</a>-Aufrufen:
</p>
<table class="wikitable">
<tbody><tr>
<th width="50%">JDBC
</th>
<th width="50%">SQLJ
</th></tr>
<tr>
<td colspan="2" align="center">Abfrage
</td></tr>
<tr valign="top">
<td>
<pre>PreparedStatement stmt = conn.prepareStatement(
"SELECT LASTNAME"
+ " , FIRSTNAME"
+ " , SALARY"
+ " FROM DSN8710.EMP"
+ " WHERE SALARY BETWEEN&nbsp;? AND&nbsp;?");
stmt.setBigDecimal(1, min);
stmt.setBigDecimal(2, max);
ResultSet rs = stmt.executeQuery();
while (rs.next()) {
lastname = rs.getString(1);
firstname = rs.getString(2);
salary = rs.getBigDecimal(3);
// Zeile drucken...
}
rs.close();
stmt.close();
</pre>
</td>
<td>
<pre>#sql private static iterator EmployeeIterator(String, String, BigDecimal);
...
EmployeeIterator iter;
#sql [ctx] iter = {
SELECT LASTNAME
, FIRSTNME
, SALARY
FROM DSN8710.EMP
WHERE SALARY BETWEEN :min AND :max
};
while (true) {
#sql {
FETCH :iter
INTO :lastname, :firstname, :salary
};
if (iter.endFetch()) break;
// Zeile drucken...
}
iter.close();
</pre>
</td></tr>
<tr>
<td colspan="2" align="center">Abfrage, die genau eine Zeile liefert
</td></tr>
<tr valign="top">
<td>
<pre>PreparedStatement stmt = conn.prepareStatement(
"SELECT MAX(SALARY), AVG(SALARY)"
+ " FROM DSN8710.EMP");
rs = statement.executeQuery();
if (!rs.next()) {
// Fehler -- nichts gefunden
}
maxSalary = rs.getBigDecimal(1);
avgSalary = rs.getBigDecimal(2);
if (rs.next()) {
// Fehler -- mehr als ein Treffer
}
rs.close();
stmt.close();
</pre>
</td>
<td>
<pre>#sql [ctx] {
SELECT MAX(SALARY), AVG(SALARY)
INTO :maxSalary, :avgSalary
FROM DSN8710.EMP
};
</pre>
</td></tr>
<tr>
<td colspan="2" align="center">INSERT
</td></tr>

<tr valign="top">
<td>
<pre>PreparedStatement stmt = conn.prepareStatement(
"INSERT INTO DSN8710.EMP " +
"(EMPNO, FIRSTNME, MIDINIT, LASTNAME, HIREDATE, SALARY) "
+ "VALUES (?,&nbsp;?,&nbsp;?,&nbsp;?, CURRENT DATE,&nbsp;?)");
stmt.setString(1, empno);
stmt.setString(2, firstname);
stmt.setString(3, midinit);
stmt.setString(4, lastname);
stmt.setBigDecimal(5, salary);
stmt.executeUpdate();
stmt.close();
</pre>
</td>
<td>
<pre>#sql [ctx] {
INSERT INTO DSN8710.EMP
(EMPNO, FIRSTNME, MIDINIT, LASTNAME, HIREDATE, SALARY)
VALUES
(:empno, :firstname, :midinit, :lastname, CURRENT DATE, :salary)
};
</pre>
</td></tr></tbody></table>
<div class="mw-heading mw-heading2"><h2 id="Weblinks">Weblinks</h2></div>
<ul><li><a rel="nofollow" class="external text" href="https://www.redbooks.ibm.com/abstracts/sg246435.html">IBM Redbook: DB2 for z/OS and OS/390: Ready for Java</a></li></ul></div><!--htdig_noindex--><div><div class="zim-footer">
Dieser Artikel wurde von <a class="external text" title="Zuletzt bearbeitet am 2024-10-16" href="https://de.wikipedia.org/wiki/?title=SQLJ&amp;oldid=249461578">Wikipedia</a> herausgegeben. Der Text ist unter <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.de">Creative Commons Attribution-Share Alike 4.0</a> verfügbar, sofern nicht anders angegeben. Für die Mediendateien können zusätzliche Bedingungen gelten.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>
<script src="./_webp_/webpHandler.js"></script>

</body></html>